// 鸭子父类
class Duck {
    protected String color;
    protected double heavy;

    // 构造方法
    public Duck(String color, double heavy) {
        this.color = color;
        this.heavy = heavy;
    }

    // 默认构造方法
    public Duck() {
        this.color = "白色";
        this.heavy = 1.0;
    }

    // 飞行方法
    public void fly() {
        System.out.println("鸭子正在飞行");
    }

    // 叫声方法
    public void quack() {
        System.out.println("鸭子正在叫：嘎嘎嘎");
    }

    // 显示信息方法
    public void display() {
        System.out.println("这是一只" + color + "的鸭子，重量：" + heavy + "kg");
    }

    // 设置重量的方法 - 将被重载
    public void setHeavy(double heavy) {
        this.heavy = heavy;
        System.out.println("鸭子重量设置为：" + heavy + "kg");
    }

    // getter和setter方法
    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public double getHeavy() {
        return heavy;
    }
}

// 绿头鸭子子类
class MallardDuck extends Duck {

    public MallardDuck() {
        super("绿色", 1.2);
    }

    public MallardDuck(double heavy) {
        super("绿色", heavy);
    }

    // 重写父类的fly方法
    @Override
    public void fly() {
        System.out.println("绿头鸭子正在高空飞行");
    }

    // 重写父类的quack方法
    @Override
    public void quack() {
        System.out.println("绿头鸭子正在叫：呱呱呱");
    }

    // 重载setHeavy方法 - 添加验证逻辑
    public void setHeavy(double heavy, boolean validate) {
        if (validate && heavy > 0) {
            this.heavy = heavy;
            System.out.println("验证通过：绿头鸭子重量设置为：" + heavy + "kg");
        } else if (validate) {
            System.out.println("验证失败：重量必须大于0");
        } else {
            this.heavy = heavy;
            System.out.println("绿头鸭子重量设置为：" + heavy + "kg");
        }
    }

    // 重载setHeavy方法 - 带单位转换
    public void setHeavy(int heavyInGrams) {
        this.heavy = heavyInGrams / 1000.0;
        System.out.println("绿头鸭子重量设置为：" + heavyInGrams + "g (" + this.heavy + "kg)");
    }

    // 重写display方法
    @Override
    public void display() {
        System.out.println("这是一只漂亮的绿头鸭子，颜色：" + color + "，重量：" + heavy + "kg");
    }
}

// 北京鸭子子类
class PekingDuck extends Duck {
    private boolean canFly;

    public PekingDuck() {
        super("白色", 2.5);
        this.canFly = false;
    }

    public PekingDuck(double heavy) {
        super("白色", heavy);
        this.canFly = false;
    }

    // 重写父类的fly方法
    @Override
    public void fly() {
        if (canFly) {
            System.out.println("北京鸭子正在低空飞行");
        } else {
            System.out.println("北京鸭子太重了，飞不起来");
        }
    }

    // 重写父类的quack方法
    @Override
    public void quack() {
        System.out.println("北京鸭子正在叫：咯咯咯");
    }

    // 重载setHeavy方法 - 带飞行能力判断
    public void setHeavy(double heavy, String reason) {
        double oldHeavy = this.heavy;
        this.heavy = heavy;

        // 根据重量自动判断是否能飞行
        this.canFly = heavy < 2.0;

        System.out.println("北京鸭子重量从" + oldHeavy + "kg修改为：" + heavy + "kg");
        System.out.println("修改原因：" + reason);
        System.out.println("当前飞行能力：" + (canFly ? "可以飞行" : "不能飞行"));
    }

    // 重载setHeavy方法 - 带百分比调整
    public void setHeavy(double percentage, boolean isIncrease) {
        if (isIncrease) {
            this.heavy = this.heavy * (1 + percentage / 100);
            System.out.println("北京鸭子重量增加" + percentage + "%，新重量：" + String.format("%.2f", this.heavy) + "kg");
        } else {
            this.heavy = this.heavy * (1 - percentage / 100);
            System.out.println("北京鸭子重量减少" + percentage + "%，新重量：" + String.format("%.2f", this.heavy) + "kg");
        }

        // 更新飞行能力
        this.canFly = this.heavy < 2.0;
    }

    // 重写display方法
    @Override
    public void display() {
        System.out.println("这是一只肥美的北京鸭子，颜色：" + color + "，重量：" + heavy + "kg，飞行能力：" + (canFly ? "有" : "无"));
    }

    // 特有的方法
    public void roast() {
        System.out.println("北京烤鸭，美味可口！");
    }
}

